import xml.etree.ElementTree as ET
import struct
import os
import sys

# Verificar argumentos
#if len(sys.argv) != 3:
#    print("Uso: python script.py <archivo_entrada.tmx> <archivo_salida.bin>")
#    sys.exit(1)

nombre_mapa = r"C:\Users\iescr\todo\sistemas\retro\spectrum\programacion\boriel\codigo\mio\gameBigSprites\actual\mapas\mapa\mapa.tmx"
pathOutput = r"C:\Users\iescr\todo\sistemas\retro\spectrum\programacion\boriel\codigo\mio\gameBigSprites\actual\mapas\mapa\test.bin"

# === Directorios base ===
script_dir = os.path.dirname(os.path.abspath(__file__))
base_dir = os.path.normpath(os.path.join(script_dir, "..", ".."))  # directorio del proyecto

tmx_path = os.path.join(base_dir, nombre_mapa)
pathOutput = os.path.join(base_dir, pathOutput)

tree = ET.parse(tmx_path)
root = tree.getroot()

chunks = root.findall('.//chunk')

header = bytearray()
data = bytearray()
mapa_bits = bytearray(96)
offsets = []

for chunk in chunks:
    x = int(chunk.attrib['x']) // 32
    y = int(chunk.attrib['y']) // 24
    offset = len(data)

    # Guardar offset para la tabla
    offsets.append((x, y, offset))

    # Procesar datos de la pantalla
    raw_data = chunk.text.strip().replace('\n', '')
    values = list(map(int, raw_data.split(',')))
    for i in range(96):
        mapa_bits[i] = 0

    for i, valor in enumerate(values):  # 'values' es tu lista de enteros
        if valor >= 256:
            byte_index = i // 8
            bit_index = 7 - (i % 8)
            mapa_bits[byte_index] |= (1 << bit_index)
            values[i] = valor - 256  # modifica el valor en la lista

    screen = bytearray(values)
    # Convertir a bytes (sin limitar valores)
    
    bloque = screen + mapa_bits
    data.extend(bloque)
# Crear encabezado: x (int8), y (int8), offset (uint16 little endian)
for x, y, offset in offsets:
    header += struct.pack('<bbH', x, y, offset)

# Escribir el archivo binario
with open(pathOutput, 'wb') as f:
    f.write(header)
    f.write(data)

print(f"Archivo generado: {pathOutput}")

# === Generar archivo .txt ===
# Calcular rutas
bin_dir = os.path.dirname(pathOutput)
bin_filename = os.path.basename(pathOutput)
txt_dir = os.path.join(bin_dir, "txts")
os.makedirs(txt_dir, exist_ok=True)

# Nombre del archivo txt
txt_filename = os.path.splitext(bin_filename)[0] + ".txt"
txt_path = os.path.join(txt_dir, txt_filename)

# Longitudes necesarias
header_len = len(header)
data_len = len(data)
map_offset = header_len

# Formatear líneas
line1 = "2                      MAP FILE "
line2 = f"{0:<5}{header_len:>5}{'map_header':>15}"
line3 = f"{map_offset:<5}{data_len:>5}{'start_map':>15}"

# Escribir archivo txt
with open(txt_path, 'w') as f:
    f.write(line1 + "\n")
    f.write(line2 + "\n")
    f.write(line3 + "\n")

print(f"Archivo TXT generado: {txt_path}")
